package com.xp.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xp.dto.flow.FlowExecutionDTO;
import com.xp.dto.flow.FlowExecutionRequest;
import com.xp.dto.flow.FlowQueryRequest;
import com.xp.entity.FlowExecution;
import com.xp.utils.Result;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 流程执行服务接口
 * 
 * @author xp
 * @since 2025-01-01
 */
public interface FlowExecutionService extends BaseService<FlowExecution> {

    /**
     * 分页查询流程执行记录列表
     * 
     * @param page 分页参数
     * @param queryRequest 查询请求参数
     * @return 流程执行记录分页结果
     */
    Result<IPage<FlowExecutionDTO>> getFlowExecutionPage(Page<FlowExecutionDTO> page, FlowQueryRequest queryRequest);

    /**
     * 同步执行流程
     * 
     * @param flowCode 流程编码
     * @param inputData 输入数据
     * @param executorId 执行者ID
     * @param applicationName 应用名称
     * @return 执行结果
     */
    Result<Object> executeFlowSync(String flowCode, Object inputData, Long executorId, String applicationName);

    /**
     * 异步执行流程
     * 
     * @param flowCode 流程编码
     * @param inputData 输入数据
     * @param executorId 执行者ID
     * @param applicationName 应用名称
     * @return 执行ID
     */
    Result<String> executeFlowAsync(String flowCode, Object inputData, Long executorId, String applicationName);

    /**
     * 停止流程执行
     * 
     * @param executionId 执行ID
     * @return 操作结果
     */
    Result<Object> stopFlowExecution(Long executionId);

    /**
     * 重新执行流程
     * 
     * @param executionId 原执行ID
     * @return 新的执行结果
     */
    Result<FlowExecutionDTO> reExecuteFlow(String executionId);

    /**
     * 重试流程执行
     * 
     * @param executionId 执行ID
     * @return 重试结果
     */
    Result<String> retryFlowExecution(Long executionId);

    /**
     * 获取流程输入数据
     * 
     * @param id 流程执行ID
     * @return 输入数据
     */
    Result<Object> getFlowInputData(Long id);

    /**
     * 获取流程输出数据
     * 
     * @param id 流程执行ID
     * @return 输出数据
     */
    Result<Object> getFlowOutputData(Long id);

    /**
     * 根据执行ID获取流程执行详情
     * 
     * @param executionId 执行ID
     * @return 流程执行信息
     */
    Result<FlowExecutionDTO> getFlowExecutionById(Long executionId);

    /**
     * 根据链路追踪ID获取流程执行记录
     * 
     * @param traceId 链路追踪ID
     * @return 流程执行记录
     */
    Result<FlowExecutionDTO> getFlowExecutionByTraceId(String traceId);

    /**
     * 根据流程编码获取执行记录
     * 
     * @param flowCode 流程编码
     * @param limit 记录数限制
     * @return 流程执行记录列表
     */
    Result<List<FlowExecutionDTO>> getFlowExecutionsByFlowCode(String flowCode, Integer limit);

    /**
     * 获取正在执行的流程列表
     * 
     * @return 流程执行记录列表
     */
    Result<List<FlowExecutionDTO>> getRunningFlowExecutions();

    /**
     * 获取执行失败的流程列表
     * 
     * @param limit 记录数限制
     * @return 流程执行记录列表
     */
    Result<List<FlowExecutionDTO>> getFailedFlowExecutions(Integer limit);



    /**
     * 获取流程执行趋势数据
     * 
     * @param flowCode 流程编码（可选）
     * @param days 天数
     * @return 趋势数据
     */
    Result<List<Map<String, Object>>> getFlowExecutionTrend(String flowCode, Integer days);

    /**
     * 获取流程执行性能分析
     * 
     * @param flowCode 流程编码
     * @return 性能分析数据
     */
    Result<Map<String, Object>> getFlowExecutionPerformance(String flowCode);

    /**
     * 清理过期的执行记录
     * 
     * @param days 保留天数
     * @return 清理结果
     */
    Result<Object> cleanExpiredExecutions(Integer days);

    /**
     * 导出流程执行记录
     * @param flowCode 流程编码
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param format 导出格式
     * @return 导出结果
     */
    Result<Object> exportFlowExecutions(String flowCode, String startTime, String endTime, String format);

    /**
     * 获取流程执行日志
     * @param executionId 执行ID
     * @return 执行日志列表
     */
    Result<List<Object>> getFlowExecutionLogs(Long executionId);

    /**
     * 获取节点执行详情
     * @param executionId 执行ID
     * @return 节点执行详情列表
     */
    Result<List<Object>> getNodeExecutionDetails(Long executionId);

    /**
     * 获取流程执行的节点执行情况
     * 
     * @param executionId 执行ID
     * @return 节点执行情况
     */
    Result<List<Object>> getFlowExecutionNodes(String executionId);

    /**
     * 暂停流程执行
     * 
     * @param executionId 执行ID
     * @return 操作结果
     */
    Result<Object> pauseFlowExecution(Long executionId);

    /**
     * 恢复流程执行
     * 
     * @param executionId 执行ID
     * @return 操作结果
     */
    Result<Object> resumeFlowExecution(Long executionId);

    /**
     * 获取流程执行状态
     * 
     * @param executionId 执行ID
     * @return 执行状态
     */
    Result<Object> getFlowExecutionStatus(Long executionId);

    /**
     * 批量停止流程执行
     * 
     * @param executionIds 执行ID列表
     * @return 操作结果
     */
    Result<Object> batchStopFlowExecutions(List<Long> executionIds);

    /**
     * 获取流程执行的输入输出数据
     * 
     * @param executionId 执行ID
     * @return 输入输出数据
     */
    Result<Map<String, Object>> getFlowExecutionData(String executionId);

    /**
     * 获取流程性能分析
     * 
     * @param flowCode 流程编码
     * @param days 分析天数
     * @return 性能分析数据
     */
    Result<Object> getFlowPerformanceAnalysis(String flowCode, Integer days);

    /**
     * 清理过期执行记录
     * 
     * @param retentionDays 保留天数
     * @return 清理结果
     */
    Result<Object> cleanupExpiredRecords(Integer retentionDays);

    /**
     * 获取流程执行统计信息
     * 
     * @param days 统计天数
     * @return 统计信息
     */
    Result<Object> getFlowExecutionStatistics(Integer days);

    /**
     * 获取流程执行趋势
     * 
     * @param days 趋势天数
     * @param granularity 时间粒度
     * @return 趋势数据
     */
    Result<Object> getFlowExecutionTrends(Integer days, String granularity);
}